feat: test skill 추가#647
Conversation
Walkthrough
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes 제안하는 리뷰어
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
claude.md (1)
367-367:⚠️ Potential issue | 🟡 Minor
test.md참조가 오래된 경로를 가리키고 있을 수 있습니다.Line 367의
test.md참조가 현재 PR에서 추가된.claude/skills/test/SKILL.md와 일치하지 않습니다. 테스트 가이드가 skill 파일로 이동했다면 이 참조도 업데이트하는 것이 좋겠습니다.제안하는 수정
-- **테스트 가이드**: `test.md` 파일 참고 +- **테스트 가이드**: `.claude/skills/test/SKILL.md` 파일 참고 (`/test` skill로 자동 로드)
🤖 Fix all issues with AI agents
In @.claude/skills/test/SKILL.md:
- Around line 32-36: Add a language identifier to the Markdown code block that
shows the directory tree so markdownlint MD040 is resolved: update the block
containing "[Entity]FixtureBuilder.java" and "[Entity]Fixture.java" to start
with ```text (or ```plaintext) instead of plain ```, keeping the rest of the
block unchanged.
- Around line 104-123: The example incorrectly accesses a private final field
chatRoomFixtureBuilder on ChatRoomFixture; change the example to access the
builder via a public accessor or inject the builder into the test instead—e.g.,
call a getter on ChatRoomFixture (e.g.,
ChatRoomFixture.getChatRoomFixtureBuilder()) or add an `@Autowired`
ChatRoomFixtureBuilder field in the test and use that builder to call
chatRoom().isGroup(true).mentoringId(100L).create(); ensure you reference the
ChatRoomFixture class and its chatRoom(...) convenience method and the builder's
chatRoom() method when making the change.
- Around line 237-246: The exception assertion example is incorrect: replace the
use of assertThatCode(() -> method()) with assertThatThrownBy(() -> method()) so
the test actually asserts that an exception is thrown; update the sample to call
assertThatThrownBy with the same thrown-exception expectations
(isInstanceOf(CustomException.class).hasMessage("error message")) and leave the
assertAll multi-assert example unchanged.
- 응답 대기시 알람발송 - 컨벤션 어겼을 때 훅 작동
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Fix all issues with AI agents
In @.claude/hooks/notify.sh:
- Around line 1-2: The notify.sh script in .claude/hooks is dead code because
settings.json's Notification hook uses an inline osascript command; either
update settings.json to call the hook script (e.g., point the Notification
command to ".claude/hooks/notify.sh") so the script with timestamp is used, or
delete .claude/hooks/notify.sh and keep the inline osascript in
settings.json—make the change consistently (modify settings.json's Notification
entry or remove the file) and verify the notification still works; target
symbols: .claude/hooks/notify.sh and the Notification entry in settings.json.
In @.claude/settings.json:
- Around line 6-16: The Notification hook contains an unsupported "matcher"
field and uses an inline osascript command; remove the unsupported "matcher" key
from the "Notification" object and replace the inline command "osascript -e
'display notification ...'" with a call to the existing notify.sh script (e.g.,
invoke notify.sh with the same title/message so it uses its timestamp and sound
behavior). Update the "hooks" entry under "Notification" to use type "command"
and command "./notify.sh" (or the project-specific notify.sh invocation) so
Notification uses the standardized notify.sh implementation instead of the
inline osascript.
🧹 Nitpick comments (3)
.claude/hooks/post-edit-check.py (3)
9-10: 조건 순서가 살짝 아쉬워요.
not file_path.endswith(".java") or not file_path에서not file_path체크는 사실상 도달하지 않습니다 (빈 문자열이면 첫 번째 조건에서 이미True). 가독성을 위해 순서를 바꾸는 것을 추천드립니다.✨ 제안
-if not file_path.endswith(".java") or not file_path: +if not file_path or not file_path.endswith(".java"):
12-17:Exception전체를 무시하는 것은 디버깅 시 불편할 수 있어요.
- 정적 분석(Ruff BLE001)에서도 지적하고 있습니다.
- 훅 스크립트 특성상 조용히 종료하는 것이 합리적이긴 하지만, 최소한
(FileNotFoundError, PermissionError, OSError)정도로 좁혀주면 예상치 못한 에러를 놓치지 않을 수 있습니다.✨ 제안
-except Exception: +except (FileNotFoundError, PermissionError, OSError): sys.exit(0)
30-43: Entity 필드 감지 정규식이 일부 흔한 패턴을 놓칠 수 있어요.
- 초기화가 있는 필드:
private String name = "default";—= value부분이 패턴에 없어서 매칭되지 않습니다.- 중첩 제네릭:
private Map<String, List<String>> map;—<[^>]+>는 내부>에서 끊깁니다.- 배열 타입:
private String[] names;—\w+뒤에[]가 허용되지 않습니다.실제로 이런 필드들은 경고 없이 통과하게 되므로, 체크의 효과가 제한될 수 있습니다.
✨ 더 넓은 범위를 커버하는 패턴 제안
- field_pattern = re.compile(r"^\s+private\s+\w+(?:<[^>]+>)?\s+\w+;") + field_pattern = re.compile(r"^\s+private\s+\S+\s+\w+\s*(?:=.*)?;")이렇게 하면 타입 부분을
\S+로 느슨하게 잡아 제네릭/배열을 포함하고,(?:=.*)?로 초기화 구문도 허용합니다. 단, 너무 느슨하면 false positive가 늘어날 수 있으니 팀과 논의해 주세요.
* feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성 (#620) * feat: 파견 대학 테이블명 변경 및 협정 대학 테이블 추가하는 DDL 작성 * refactor: 테이블명 변경 및 추가에 따른 엔티티 생성 - 또한 목데이터 생성 로직 수정 * test: 테스트 코드에서 University -> HostUniversity로 변경 * chore: 중복 인덱스 생성 방지를 위해 인덱스 생성 제거 - FK 제약조건을 추가할 때 인덱스가 없다면 알아서 추가하기 때문 * chore: home_university 테이블에 created/updated_at 추가 * refactor: 잘못 설정되었던 테이블 간 연관 관계 재설정 (#622) * refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록 * chore: FK 변경에 따른 목데이터 수정 * test: 테스트 픽스터 수정 * refactor: 대학 검색 응답 수정 (#624) * refactor: home_university와 university_info_for_apply가 FK 관계를 가지도록 * chore: FK 변경에 따른 목데이터 수정 * refactor: 필터 검색 엔드포인트 삭제 * refactor: 필터 검색 관련 서비스 로직 삭제 * refactor: 필터 검색 관련 레포지토리 메서드 삭제 * refactor: 필터 검색 관련 DTO 삭제 * test: 필터 검색 관련 테스트 코드 삭제 * refactor: 지원 대학 관련 응답에 협정 대학 이름 추가 * test: 지원 대학 응답 수정에 따른 테스트 수정 * refactor: 간접 참조 대신 연관관계 추가 - N+1 방지를 위해 fetch join도 추가 * test: 간접 참조 방식에서 연관 관계 설정으로 따른 테스트 코드 수정 * chore: 목데이터에서 지원 대학 테이블에 협정 대학 ID를 설정하도록 * test: home university fixture 추가 * refactor: home university에 대한 fetch join 추가 * refactor: s3 버전 업그레이드 및 로직 수정 (#608) * refactor: s3 sdk 버전 업그레이드 - 의존성 수정 - 버전 업그레이드에 따른 코드 수정 * refactor: 이미지 이외의 파일 관리를 위해 ImgType 의미 명확하도록 수정 - ImgType에서 UploadType으로 변경 - 해당되는 파일 모두 수정 * refactor: s3 테스트 코드 추가 * fix: s3 access-key, secret-key 최신화, 버킷 명칭 올바르게 수정 * fix: ChatService Test 변경점 반영, S3ServiceTest 단위 테스트로 변경 - images->files로 디렉토리 경로 수정 * fix: 이중 비동기 실행문제 해결 - @async에 전적으로 위임 * refactor: S3Service error 메시지 NPE 가능성 제거 * refactor: 수정사항 반영 - UploadType -> UploadPath로 명칭변경 - 컨벤션 수정(미사용 변수 삭제, 들여쓰기, 명칭변경) * fix: 테스트 코드 오류 수정 - 내부 로직에서 사용하는 fileUploadService 정의 * refactor: 수정사항 반영 - 파일 확장자 상수화 - 확장자 확인로직, 채팅이면 모든 파일 허용, 이미지 확인까지 모두 enum에서 관리 - MultipartFile이 비동기 과정에서 유실되지 않도록 byte로 변환해서 전달 - UrlPrefixResponse PascalCase로 변경 * refactor: 컨벤션 수정 - 사용하지 않는 import문 삭제 * refactor: 리프레시 토큰 만료시 쿠키 삭제 (#628) * refactor: 리프레시 토큰 만료시 쿠키 삭제 * refactor: 인증 전용 예외 생성 * refactor: 멘토링 조회 응답에 mentoringId 필드 추가 (#638) * feat: WebSocket 로깅 인터셉터 작성 (#635) * feat: WebSocket 로깅 인터셉터 작성 * refactor: Principal 명시적 형 변환 대신 null 체크하여 형 변환 * feat: 어드민에서 파견 대학을 관리하도록 (#633) * feat: 파견 대학 CRUD 관련 ErrorCode 추가 - HOST_UNIVERSITY_HAS_REFERENCES : 파견 대학 삭제 시 해당 대학을 참조하는 UnivApplyInfo가 존재하는 경우 * feat: 파견 대학 관련 정보를 업데이트하는 도메인 메서드 작성 * feat: 조회 관련 Repository 메서드 구현 * feat: 파견 대학 검색 관련 QueryDSL로 구현 * feat: 어드민 파견 대학 CRUD 관련 DTO 작성 * feat: country 조회 관련 로직 추가 및 ErrorCode 추가 * feat: 어드민 파견 대학 CRUD 관련 서비스 로직 작성 * feat: 어드민 파견 대학 관련 컨트롤러 작성 * test: 어드민 파견 대학 관리 관련 테스트 작성 * refactor: 엔드포인트의 path variable 이름 변경 - id -> host-university-id * refactor: PageResponse 응답 객체를 사용하도록 * test: 응답 변경에 따른 테스트 코드 수정 * fix: host_university 테이블의 korean_name 필드에 unique key 추가 (#645) * fix: host_university 테이블의 korean_name 필드에 unique key 쿠가 * test: test용 hostUniversityRepository 생성 * test: 고유한 korean_name을 가진 host university 객체를 사용하도록 * fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격 (#639) * fix: 멘토 지원서 승인 시 유저 Role 을 Mentor로 승격 * fix: 멘토 지원서 승인 시 멘토 생성 * fix: 멘토의 introduction, passTip null 허용하도록 수정 - not null 인 필드에 빈문자열로 값을 채우는 것 보다, null 허용이 더 의미 있다 판단하여 null 을 허용하도록 하였습니다. * fix: 사용하지 않는 멘토 생성 api 제거 - 멘토 생성의 주체가 어드민으로 변경되어 Mentor 도메인의 Mentor 생성 api 를 제거 * feat: 멘토 지원서 승인 예외처리 추가 - 중복 멘토 생성 예외 처리 및 테스트 추가 * refactor: Mentor 생성 시 null 전달 제거 * refactor: 멘토 지원서 승낙 시, 검증 후 승격 및 멘토 생성 * chore: 스크립트 버전 수정 (#651) * chore: 스크립트 버전 수정 * test: korean_name 컬럼 UK 관련 테스트 코드 수정 * feat: test skill 추가 (#647) * feat: serena MCP 추가 * feat: test skill 추가 * feat: hook 추가 - 응답 대기시 알람발송 - 컨벤션 어겼을 때 훅 작동 * feat: 안쓰는 파일 제거 * fix: 게시글 중복 생성 방지 (#649) * fix: 게시글 중복 생성 방지 - Redis 패키지 및 로직 정리 * fix: 게시글 중복 생성 방지 - 게시글 중복 요청 방지 Redis 로직 추가 * refactor: 게시글 중복 생성 방지 * chore: testcontainer 버전 업 (#659) * chore: windows에서도 hook이 동작하도록 (#655) * refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653) refactor: 오래된 이미지 삭제 후 이미지 pull하도록 변경 (#653) - 추가로 이미지는 5개 -> 2개 보관하도록 변경 * refactor: 멘토 도메인 응답의 사용자 id를 siteUserId로 통일 (#665) * refactor: 멘토 관련 id응답은 모두 site-user-id가 되도록 수정 * test: 멘토 관련 테스트 코드 수정 * refactor: 채팅 도메인 응답의 사용자 관련 id를 siteUserId로 통일 (#666) * refactor: 채팅 관련 응답에서 사용자 관련 Id를 siteUserId로 통일 * refactor: siteUserId를 포함하도록 서비스 코드 수정 * test: 사용자 id로 응답 통일 관련 테스트 수정 * feat: 전체 뉴스를 조회하는 API 구현 (#674) * feat: 전체 news 조회 API 구현 - 기존 API에 author-id를 선택적으로 받도록 * test: 전체 news 조회 관련 테스트 코드 작성 * refactor: 날짜 오름차순으로 news 조회하는 JPA 메서드 추가 * refactor: 뉴스 조회 API를 하나로 통합 - 서비스 계층에서 siteUserId == null을 기준으로 분기하도록 * refactor: 컨트롤러 계층에서 분기문 제거 - 분기를 서비스 계층에게 위임했음 * test: 뉴스 조회 관련 테스트 코드 수정 * chore: 누락된 제약 조건을 추가하는 스크립트 작성 (#676) --------- Co-authored-by: Yeon <84384499+lsy1307@users.noreply.github.com> Co-authored-by: 황규혁 <126947828+Gyuhyeok99@users.noreply.github.com> Co-authored-by: hyungjun <115551339+sukangpunch@users.noreply.github.com> Co-authored-by: 정재희 <y2hjjh@naver.com>
관련 이슈
작업 내용
claude.md에 있던 테스트 관련 컨벤션을 별도의 skill로 뺐습니다.
테스트를 모든 세션에서 작업하지 않는데 매번 claude가 이 테스트 컨벤션을 읽는 게 비효율적인 거 같습니다!
이제 테스트 작업 시에 /test로 skill을 활성화시키면 될 거 같습니다. 사실 별도로 안해도 테스트 관련 작업 시키면 디스크립션을 이해하고 알아서 활성화 시키는 것도 확인했습니다.
추가로 세레나 MCP도 저는 활성화 시켜서 위에 사진 보면 세레나 MCP가 작동하는 걸 확인할 수 있습니다~
=====추가 수정 =====
앗 작업하다보니 욕심이 생겨서 hook도 추가했습니다.
저희 컨벤션 실수하는 경우가 많은데 만약 클로드코드 쓰신다면 hook이 작동해서 개행이나 와일드카드 사용, 혹은 @Colum누락시 알려주도록 추가했고 클로드 코드 작업 기다리다보면 다른 짓(?) 하는 경우가 많은데 사용자 답변 기다릴 경우에 알람 주도록 추가했어요~
(참고로 item에서만 테스트해서 다른 툴에서 되는진 모르겠습니다.)
특이 사항
리뷰 요구사항 (선택)